From 326a9fc904b2a1e303abd2e3bc5b521603579be8 Mon Sep 17 00:00:00 2001 From: Thomas Mudrunka Date: Tue, 23 Aug 2011 03:31:52 +0200 Subject: [PATCH] Zakladni framework pro preklady (+ cesky preklad) --- assistants/stats.inc.php | 2 +- index.php | 59 +++++++++++++++++--------- install.sql | 6 +-- lib/Locale.class.php | 45 ++++++++++++++++++++ locale/cs/messages.inc.php | 87 ++++++++++++++++++++++++++++++++++++++ locale/en/messages.inc.php | 7 +++ 6 files changed, 183 insertions(+), 23 deletions(-) create mode 100755 lib/Locale.class.php create mode 100644 locale/cs/messages.inc.php create mode 100644 locale/en/messages.inc.php diff --git a/assistants/stats.inc.php b/assistants/stats.inc.php index f295c76..e353128 100644 --- a/assistants/stats.inc.php +++ b/assistants/stats.inc.php @@ -31,5 +31,5 @@ $queries = array( //TODO: use build_query_select()!!! foreach($queries as $description => $sql) { echo "

$description

"; - echo $this->html->render_item_table($result = $this->db->safe_query($sql)->fetchAll(PDO::FETCH_ASSOC)); + echo $this->html->render_item_table($result = $this->db->safe_query_fetch($sql)); } diff --git a/index.php b/index.php index 7a8167c..9fd0527 100755 --- a/index.php +++ b/index.php @@ -22,6 +22,7 @@ set_include_path(DIR_LIB.PATH_SEPARATOR.get_include_path()); require_once('Sklad_LMS-fake.class.php'); require_once('HTTP_Auth.class.php'); +require_once('Locale.class.php'); /** * Trida poskytuje vseobecne funkce pro generovani HTML kodu @@ -58,7 +59,7 @@ class HTML { function link($title='n/a', $link='#void', $internal=true) { if($internal) $link = $this->internal_url($link); - return "$title"; + return "".T($title).""; } function img($src='#void', $title='img') { @@ -68,7 +69,10 @@ class HTML { function input($name=false, $value=false, $type='text', $placeholder=false, $options=false) { $html = " $row) { $table_sorted[$id] = array(); foreach($precedence as $column) if(isset($table[$id][$column])) { - $table_sorted[$id][$column]=$table[$id][$column]; + $table_sorted[$id][T($column)]=$table[$id][$column]; unset($table[$id][$column]); } - $table_sorted[$id]=array_merge($table_sorted[$id],$table[$id]); + //$table_sorted[$id]=array_merge($table_sorted[$id],$table[$id]); + foreach($table[$id] as $key => $val) $table_sorted[$id][T($key)] = $val; //array_merge with T() translating } $table = $table_sorted; } @@ -276,7 +281,7 @@ EOF; if($multi_insert) $html.='
'; //$html.=$this->input('table', $class, 'hidden'); foreach($columns as $column) { - $html.=$class.':'.$column['Field'].': '; + $html.=T($class).':'.T($column['Field']).': '; $name="values[$class][".$column['Field'].'][]'; $val = $update && isset($current[$column['Field']]) ? $current[$column['Field']] : false; switch(true) { @@ -358,7 +363,7 @@ class Sklad_DB extends PDO { //WHERE/REGEXP if($search) { $search = $this->quote($search); - if(!isset($search_fields[$class])) $this->post_redirect_get($class, "Ve tride $class zatim vyhledavat nemozno :-("); + if(!isset($search_fields[$class])) die(trigger_error(T("Can't search in $class table yet :-("))); //TODO: post_redirect_get $sql_search = ''; foreach($search_fields[$class] as $column) $sql_search .= "OR $column REGEXP $search "; $where[] = "FALSE $sql_search"; @@ -390,9 +395,26 @@ class Sklad_DB extends PDO { return $result; } + function translate_query_results($result) { + $translate_cols = array('status_name', 'item_valid_till'); //TODO: Hardcoded + foreach($result as $key => $row) { + foreach($translate_cols as $col) if(isset($result[$key][$col])){ + $result[$key][$col] = T($result[$key][$col]); + } + } + return $result; + } + + function safe_query_fetch($sql, $fatal=true, $fetch_flags = PDO::FETCH_ASSOC, $translate=true) { + $result = $this->safe_query($sql, $fatal)->fetchAll($fetch_flags); + if($translate) $result = $this->translate_query_results($result); + return $result; + } + + function get_listing($class, $id=false, $limit=false, $offset=0, $where=false, $search=false, $history=false, $indexed=array(), $suffix_id='_id') { $sql = $this->build_query_select($class, $id, $limit, $offset, $where, $search, $history); - $result = $this->safe_query($sql)->fetchAll(PDO::FETCH_ASSOC); + $result = $this->safe_query_fetch($sql); if(!$result || !is_array($indexed)) return $result; foreach($result as $key => $row) $indexed[$row[$class.$suffix_id]]=$row; @@ -402,7 +424,7 @@ class Sklad_DB extends PDO { function get_columns($class) { $class = $this->escape($class); $sql = "SHOW COLUMNS FROM $class;"; - return $this->safe_query($sql)->fetchAll(PDO::FETCH_ASSOC); + return $this->safe_query_fetch($sql); } function columns_get_selectbox($columns, $class=false, $suffix_id='_id', $suffix_name='_name') { @@ -415,9 +437,8 @@ class Sklad_DB extends PDO { $history = $this->contains_history($table) ? " WHERE ${table}_valid_till=0" : ''; $sql = "SELECT $table$suffix_id, $table$suffix_name FROM $table$history;"; //TODO use build_query_select()!!! - $result = $this->safe_query($sql, false); + $result = $this->safe_query_fetch($sql, false); if(!$result) continue; - $result = $result->fetchAll(PDO::FETCH_ASSOC); foreach($result as $row) $selectbox[$table.$suffix_id][$row[$table.$suffix_id]]=$row[$table.$suffix_name]; } //echo('
'); print_r($selectbox);
@@ -428,8 +449,8 @@ class Sklad_DB extends PDO {
 		$history = $this->contains_history($table) ? " AND ${table}_valid_till=0" : '';
 		$value=$this->quote($value);
 		$sql = "SELECT $select FROM $table WHERE $key=$value$history LIMIT 1;"; //TODO use build_query_select()!!!
-		$result = $this->safe_query($sql)->fetchAll(PDO::FETCH_ASSOC);
-		if(isset($result[0][$select])) return $result[0][$select]; else die(trigger_error('Položka nenalezena!')); //TODO post_redirect_get...
+		$result = $this->safe_query_fetch($sql);
+		if(isset($result[0][$select])) return $result[0][$select]; else die(trigger_error(T('Record not found!'))); //TODO post_redirect_get...
 	}
 
 	function contains_history($table) {
@@ -612,7 +633,7 @@ class Sklad_UI {
 			$action = $_SERVER['SCRIPT_NAME']."/$class/$id/delete";
 	    $html.= "
"; $html.= $this->html->input(false, 'DELETE', 'submit'); - $html.= 'sure?'.$this->html->input('sure', false, 'checkbox'); + $html.= T('sure?').$this->html->input('sure', false, 'checkbox'); $html.= '
'; $action = $_SERVER['SCRIPT_NAME']."/$class/$id/image"; $html.= "
"; @@ -628,14 +649,14 @@ class Sklad_UI { } function post_redirect_get($location, $message='', $error=false) { - $url_args = $message != '' ? '?message='.urlencode($message) : ''; + $url_args = $message != '' ? '?message='.urlencode(T($message)) : ''; $location = $this->html->internal_url($location).$url_args; header('Location: '.$location); if($error) trigger_error($message); $location=htmlspecialchars($location); die( "". - "Location: $location" + T($message)."
Location: $location" ); } @@ -693,14 +714,14 @@ class Sklad_UI { $image_classes = array('model'); //TODO, use this more widely across the code if(!in_array($class, $image_classes)) $this->post_redirect_get("$class/$id/edit", "Nekdo nechce k DB Tride '$class' prirazovat obrazky!"); $image_destination = DIR_IMAGES."/$class/$id.jpg"; - if($_FILES['image']['name'] == '') $this->post_redirect_get("$class/$id/edit", 'Kazde neco se musi nejak jmenovat!', true); + if($_FILES['image']['name'] == '') $this->post_redirect_get("$class/$id/edit", 'Everything has to be called somehow!', true); if(move_uploaded_file($_FILES['image']['tmp_name'], $image_destination)) { chmod ($image_destination, 0664); - $this->post_redirect_get("$class/$id", 'Obrazek se naladoval :)'); - } else $this->post_redirect_get("$class/$id/edit", 'Soubor se nenahral :(', true); + $this->post_redirect_get("$class/$id", 'Image has been upbloated successfully :)'); + } else $this->post_redirect_get("$class/$id/edit", 'File upload failed :(', true); break; default: - trigger_error('Nothin\' to do here my cutie :-*'); + $this->post_redirect_get('', 'Nothin\' to do here my cutie :-*'); break; } diff --git a/install.sql b/install.sql index d02c881..df0440c 100644 --- a/install.sql +++ b/install.sql @@ -155,11 +155,11 @@ SET character_set_client = utf8; CREATE TABLE `room` ( `room_id` int(11) NOT NULL auto_increment, `room_name` varchar(64) collate utf8_czech_ci NOT NULL, - `user_id` int(11) NOT NULL default '0', + `room_author` int(11) NOT NULL default '0', `room_descript` text collate utf8_czech_ci NOT NULL, PRIMARY KEY (`room_id`), UNIQUE KEY `room_name` (`room_name`), - KEY `user_id` (`user_id`) + KEY `user_id` (`room_author`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; SET character_set_client = @saved_cs_client; @@ -256,4 +256,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2011-08-22 19:08:25 +-- Dump completed on 2011-08-23 1:30:58 diff --git a/lib/Locale.class.php b/lib/Locale.class.php new file mode 100755 index 0000000..a8c3d97 --- /dev/null +++ b/lib/Locale.class.php @@ -0,0 +1,45 @@ +. + */ + +require_once(DIR_LOCALE.'/'.LOCALE_LANG.'/messages.inc.php'); + +foreach($LOCALE_MESSAGES['regexp'] as $regexp => $replace) { + $LOCALE_MESSAGES['regexp']['/'.$regexp.'/i'] = $LOCALE_MESSAGES['regexp'][$regexp]; + unset($LOCALE_MESSAGES['regexp'][$regexp]); +} + +/** + * !!! IMPORTANT NOTICE: This is ugly hack !!! + * !!! You should rather use PHP's internal gettext support !!! + */ +function T($text) { + if(is_array($text)) return array_map('T',$text); + + if(isset($GLOBALS['LOCALE_MESSAGES']['map'][$text])) return $GLOBALS['LOCALE_MESSAGES']['map'][$text]; + + $t = strtolower($text); + if(isset($GLOBALS['LOCALE_MESSAGES']['map'][$t])) return $GLOBALS['LOCALE_MESSAGES']['map'][$t]; + + $t = trim($t); + if(isset($GLOBALS['LOCALE_MESSAGES']['map'][$t])) return $GLOBALS['LOCALE_MESSAGES']['map'][$t]; + + $text = str_ireplace(array_keys($GLOBALS['LOCALE_MESSAGES']['map']), $GLOBALS['LOCALE_MESSAGES']['map'], $text); + + return preg_replace(array_keys($GLOBALS['LOCALE_MESSAGES']['regexp']), $GLOBALS['LOCALE_MESSAGES']['regexp'], $text); +} diff --git a/locale/cs/messages.inc.php b/locale/cs/messages.inc.php new file mode 100644 index 0000000..aa4b516 --- /dev/null +++ b/locale/cs/messages.inc.php @@ -0,0 +1,87 @@ + array( + 'Sure user expected :-)' => 'Očekáván opravdový uživatel :-)', + 'Everything has to be called somehow!' => 'Kazde neco se musi nejak jmenovat!', + 'Image has been upbloated successfully :)' => 'Obrazek se naladoval :)', + 'File upload failed :(' => 'Soubor se nenahral :(', + 'Nothin\' to do here my cutie :-*' => 'Tady te zadny stesti neceka lasko :-*', + 'SAFE INCLUDE: Securityfuck.' => '[Inkluze] Nejeb tu.', + 'SAFE INCLUDE: Fuckfound.' => '[Inkluze] Kryptohovno nenalezeno!', + 'Record not found!' => 'Položka nenalezena!', + + 'item_id' => 'č.položky', + 'item_serial' => 'Sériové č.', + 'item_quantity' => 'Množství', + 'item_price_in' => 'Nákupní cena', + 'item_price_out' => 'Prodejní cena', + 'item_customer' => 'Zákazník', + 'item_note' => 'Poznámka k položce (umístění,...)', + 'item_author' => 'Odpovědný', + 'item_valid_till' => 'Položka platná do', + 'item_valid_from' => 'Položka platná od', + + 'model_image' => 'Obrázek', + 'model_name' => 'Model', + 'model_descript' => 'Popis modelu', + 'model_barcode' => 'Čárový kód modelu', + 'model_price_out' => 'Doporučená cena', + + 'room_name' => 'Sklad', + 'room_descript' => 'Popis skladu', + 'room_author' => 'Skladník', + + 'producer_name' => 'Výrobce', + 'producer_note' => 'Poznámka o výrobci', + + 'vendor_name' => 'Prodejce', + 'vendor_note' => 'Poznámka o prodejci', + + 'status_name' => 'Stav', + 'category_name' => 'Kategorie', + + 'item' => '[položka]', + 'producer' => '[výrobce]', + 'room' => '[sklad]', + 'status' => '[stav]', + 'vendor' => '[výrobce]', + 'category' => '[kategorie]', + 'model' => '[model]', + 'user' => '[uživatel]', + + 'deleted' => 'smazáno', + 'stored' => 'skladem', + 'placed' => 've firmě', + 'saled' => 'prodáno', + 'destroyed' => 'zníčeno/ztraceno', + + '0000-00-00 00:00:00' => 'aktuální', + + 'SUM(' => 'SOUČET(', + 'COUNT(' => 'POČET(', + + 'update' => 'UPRAVIT', + 'insert' => 'VLOŽIT', + 'delete' => 'SMAZAT', + 'image' => 'OBRÁZEK', + //'filter' => 'filtr', + //'go' => 'jdi', + 'sure?' => 'opravdu?', + + 'edit' => 'upravit', + 'history' => 'historie', + 'new' => 'nový', + + '' => '' + ), + 'regexp' => array( + 'You will not edit ([^ ]*) table my sweetie :-P' => 'V tabulce \1 jentak neco mazat nebudes bejby :-P', + 'Something \(i guess it was ([^ ]*)\) is gone. :\'-\(' => 'Neco (pravdepodobne \1) bylo asi smazano. Fnuk :\'-(', + 'Somebody do not want you to upload pictures for ([^ ]*) class' => 'Nekdo nechce k DB Tride \'\1\' prirazovat obrazky!', + 'Can\'t search in ([^ ]*) table yet :-\(' => 'Ve tride \1 zatim vyhledavat nemozno :-(', + '' => '', + '' => '', + '' => '', + 'hello\((.*)\)' => 'Ahoj(\1)' + ) +); diff --git a/locale/en/messages.inc.php b/locale/en/messages.inc.php new file mode 100644 index 0000000..b8cbb80 --- /dev/null +++ b/locale/en/messages.inc.php @@ -0,0 +1,7 @@ + array( + ), + 'regexp' => array( + ) +); -- 2.30.2