Проверка дали дадения език е активиран

Ticketa

Registered
Привет,
продължавам да "надграждам" платформата ми с мулти езичност. Обаче срещам проблем при обработката на информация.

По-долу ще дам примерен код какво и как се опитвам да го направя.

Идеята ми е: изпращам заглавие(title) , всяко заглавие има опция за въвеждане на активните езици (те могат да бъдат изкл. и вкл.)
Използвам масиви. title[flag].
Проблема ми е, че не получавам грешка, когато даден език съм го махнал от включените (променливата е langs_enabled_array)

Когато се опитам да добавя (в този вариант) в трите полета някакъв текст получавам резултат:
Array ( [title] => български ) Array ( [title] => english ) Array ( [title] => greek )

Би трябвало да върне отговор / грешка , че се опитвате да добавите заглавие в неразрешен/активен език. Другия вариант е просто променливата с НЕ вкл. език да бъде "изтрита" и да се върне отговор:
Array ( [title] => български ) Array ( [title] => english ) )

Необходимо ми е тази проверка да бъде работеща с цел да "игнорирам"/"предотвратя" бъдещи нежелани манипулации.

Код:
<?php
#ini_set("display_errors", "1"); error_reporting(E_ALL);
function CheckForUrl( $str, $lang_code ) {
	$arr = array( 
		"-" => "-",
		"+" => "-",
		" " => "-",
		"." => "-",
		"," => "-",
		":" => "-",
		";" => "-",
		"'" => "-",
		"\"" => "-",
		"#" => "-",
		"$" => "-",
		"%" => "-",
		"^" => "-",
		"=" => "-",
		"|" => "-",
		"/" => "-",
		"\\" => "-",
		"[" => "-",
		"]" => "-",
		"{" => "-",
		"}" => "-",
		"(" => "-",
		")" => "-",
		"@" => "-",
		"!" => "-",
		"?" => "-",
		"~" => "-",
		"*" => "-",
		"<" => "-",
		">" => "-",
		"&" => "-and-"
	);
	
	$keys = array_keys( $arr );
	$val_keys = array_values( $arr );
	
	$str = mb_convert_case( $str, MB_CASE_LOWER, "UTF-8" );
	
	$str = str_replace( $keys, $val_keys, $str );
	$str = str2latin( $str, $lang_code );

	$str = str_replace( "----", "-", $str );
	$str = str_replace( "---", "-", $str );
	$str = str_replace( "--", "-", $str );
	
	return $str;
}

function str2latin( $str, $lang_code ) {
	$langs_letters = array (
			'es,it,fr' => array (
					'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A','Ă' => 'A', 'Æ' => 'AE', 'Ç' =>
					'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
					'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' =>
					'O', 'Ő' => 'O', 'Ø' => 'O','Ș' => 'S','Ț' => 'T', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U',
					'Ý' => 'Y', 'Þ' => 'TH', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' =>
					'a', 'å' => 'a', 'ă' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
					'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' =>
					'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 'ø' => 'o', 'ș' => 's', 'ț' => 't', 'ù' => 'u', 'ú' => 'u',
					'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y'
			),
			'bg' => array (
					'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ж' => 'j',
					'з' => 'z', 'и' => 'i', 'й' => 'i', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
					'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
					'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sht', 'ъ' => 'u', 'ь' => 'i', 'ю' => 'iu', 'я' => 'q',
					'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ж' => 'J',
					'З' => 'Z', 'И' => 'I', 'Й' => 'I', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
					'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
					'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SHT', 'Ъ' => 'U', 'Ь' => 'I', 'Ю' => 'IU', 'Я' => 'Q'
			),
			'de' => array (
					'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss',
					'ẞ' => 'SS'
			),
			'el' => array (
					'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
					'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
					'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
					'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
					'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
					'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
					'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
					'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
					'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
					'Ϋ' => 'Y'
			),
			'tr' => array (
					'ş' => 's', 'Ş' => 'S', 'ı' => 'i', 'İ' => 'I', 'ç' => 'c', 'Ç' => 'C', 'ü' => 'u', 'Ü' => 'U',
					'ö' => 'o', 'Ö' => 'O', 'ğ' => 'g', 'Ğ' => 'G'
			),
			'ru' => array (
					'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
					'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
					'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
					'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
					'я' => 'ya',
					'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
					'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
					'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
					'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
					'Я' => 'Ya',
					'№' => ''
			),
			'ro' => array (
					'ă' => 'a', 'â' => 'a', 'î' => 'i', 'ș' => 's', 'ț' => 't', 'Ţ' => 'T', 'ţ' => 't'
			),
			'rs' => array (
					'ђ' => 'dj', 'ј' => 'j', 'љ' => 'lj', 'њ' => 'nj', 'ћ' => 'c', 'џ' => 'dz', 'đ' => 'dj',
					'Ђ' => 'Dj', 'Ј' => 'j', 'Љ' => 'Lj', 'Њ' => 'Nj', 'Ћ' => 'C', 'Џ' => 'Dz', 'Đ' => 'Dj'
			)
	);
	
	if( $lang_code == "all" ) {
		foreach ( $langs_letters as $lang ) {
			$str = strtr( $str, $lang );
		}
	} else {
		foreach ( $langs_letters as $key => $lang )
		{
			$key_arr = explode( ",", $key );
			if ( in_array( $lang_code, $key_arr ) )
			{
				$str = strtr( $str, $lang );
				break;
			}
		}
	}
	$a = array( '/(¡|¿|=|\+|\/|\\\|\.|\'|\_|\\n| |\(|\))/', '/[^a-z0-9_ -]/si', '/-{2,}/si' );
	$b = array( '-', '', '-' );
	
	return trim( preg_replace( $a, $b, $str ), '-' );
}

//език по подразбиране
$default_lang_id = 1; //bg

$skip_langs = array();

//вкл./активирани езици
$langs_enabled_array = [
	'bg' => [ 'code' => 'bg', ],
	'us' => [ 'code' => 'us', ],
];
//всички налични езици
$all_langs = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
	'gr' => [ 'id' => '3', 'code' => 'gr', ],
];
if(isset($_POST['submit'])) {
    $stop = [];
	$data_custom_form = array();
    $lang_error = array();
    $title = ( isset($_POST['title']) && ($_POST['title']) != '' ) ? ( ($_POST['title']) ) : '';
    
	$data_custom_form["title"] = $title;
	
	if( $title && is_array( $title ) ) {
		$title_values = array_values( $data_custom_form["title"] );
		$title_values_count = array_count_values( $title_values );
		$has_name_record = ( $title_values_count[""] < count( $langs_enabled_array ) ) ? true : false;
		foreach( $data_custom_form["title"] as $lang_code => $value ) {
			if( CheckForUrl($value, $lang_code) == "" ) {
				if( $has_name_record && $value == "" ) {
					$skip_langs[] = $lang_code;
				} else {
					$lang_error[$lang_code] = true;
					$stop[] = 'is empty';
				}
			}
        }
    } else {
        $stop[] = 'PLEASE TRY AGAIN';
	}
	if (count( $lang_error ) == count( $langs_enabled_array )) {
		foreach( $all_langs as $lng ) {
			if( $lng["id"] == $default_lang_id ) {
				$stop[] =  'lang_section_error: '.$lng['code'];
				break;
			}
		}
	} elseif( count( $lang_error ) > 0 ) 	{
		foreach( $all_langs as $lng ) 	{
			if( $lang_error[$lng["code"]] ) {
				$stop[] =  'lang_section_error: '.$lng['code'];
				break;
			}
		}
	}
	if( $stop )	{
		foreach( $data_custom_form as $data_key => $data_value ) {
			echo 'fields_errors '.$data_key;
		}
	} else {
		foreach( $all_langs as $lng ) {
			$lang_code = $lng["code"];
			if( in_array( $lang_code, $skip_langs ) )
				continue;
			
			$data = array();
			#$data["title"] = $data_custom_form["title"][$lang_code];
			if( $data_custom_form["title"][$lang_code] == "" || empty( $data_custom_form["title"][$lang_code] ) ) {
				$data["title"] = $data_custom_form["title"][$lang_code];
				$data_custom_form["title"][$lang_code] = $data_custom_form["title"][$lang_code];
			} else {
				$data["title"] = $data_custom_form["title"][$lang_code];
			}
			print_r($data);
	    }
	}
}
?>
<form action="" method="POST">
bg <input type="text" name="title[bg]" />
us <input type="text" name="title[us]" />
gr <input type="text" name="title[gr]" />
<br />
<input type="submit" name="submit" />
</form>
 
От къде ги взимате тези скриптове?

Имаш всички езици, имаш и активните - интерсектваш по ключ активните с всички и получаваш реалния масив с възможните езици. Завърташ го този масив и за всеки езиков код, ровиш в масива изпратен от формата. Дори и да пратиш нещо за езика, който не е активен, нищо няма да се случи.

Въпреки това, защо да не се добави успешно заглавие за неактивиран език? Ами в последствие, ако решиш да го активираш?
Просто генерирай полетата и ги раздели на активни и неактивни. Като човек знае, че езика е неактивен въобще няма да си направи труда да попълни полето, а дори да го попълни - по-добре за теб, че по-късно ще имаш популяризиран език, ако искаш да го активираш.
 
Нещо подобно ли имаш предвид?
Код:
<?php
$default_lang_id = 1;
$skip_langs = array();
$langs_all = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
	'gr' => [ 'id' => '3', 'code' => 'gr', ],
];
$langs_enabled = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
];
$langs_real = array();

function get_intersect(...$arrays){
    $instersect_arrays = array();

    foreach($arrays as $array){
        if(!empty($array)){
            array_push($instersect_arrays,$array);
        }
    }

    return call_user_func_array('array_intersect', $instersect_arrays);
}
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}
$langs_real = get_intersect($langs_enabled, $langs_all);
if(isset($_POST['submit'])) {
	$array = filter_input_array(INPUT_POST);
	$return = array();
	foreach (array_keys($array) as $fieldKey) {
		foreach ($array[$fieldKey] as $lang_code => $value) {
			if( in_array_r( $lang_code, $langs_real) )
				$return[$fieldKey][$lang_code] = $value;
			
		}
	} 
	print_r($return);
}
#print_r(get_intersect($langs_enabled, $langs_all));
?>
<form action="" method="POST">
bg <input type="text" name="title[bg]" />
us <input type="text" name="title[us]" />
gr <input type="text" name="title[gr]" />
<br />
<input type="submit" name="submit" />
</form>


output;
Array
(
[title] => Array
(
[bg] => asd
[us] => asd
)

)
<form action="" method="POST">
bg <input type="text" name="title[bg]" />
us <input type="text" name="title[us]" />
gr <input type="text" name="title[gr]" />
<br />
<input type="submit" name="submit" />
</form>
 
Играх си още малко и направих следното нещо:

Код:
<?php
function get_intersect(...$arrays){
    $instersect_arrays = array();

    foreach($arrays as $array){
        if(!empty($array)){
            array_push($instersect_arrays,$array);
        }
    }

    return call_user_func_array('array_intersect', $instersect_arrays);
}
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}
$langs_all = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
	'gr' => [ 'id' => '3', 'code' => 'gr', ],
];
$langs_enabled = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
];
$langs_real = array();
$langs_real = get_intersect($langs_enabled, $langs_all);
$stop = [];
if(isset($_POST['submit'])) {
	$array = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);
	$return = array();
	foreach (array_keys($array) as $fieldKey) {
		foreach ($array[$fieldKey] as $lang_code => $value) {
			if( in_array_r( $lang_code, $langs_real) ) {
				$return[$fieldKey][$lang_code] = $value;
			}
				
		}
	}
	foreach ($langs_real as $lang_code => $value) {
		if ( empty( $return['title'][$lang_code] ) ) 
			$stop[] = "#1 die - title, lang: ".$lang_code;
			
		if ( mb_strlen( $return['title'][$lang_code], 'utf-8') > 200 )
			$stop[] = "#2 die - title, max 200, lang: ".$lang_code;
	
		if ( empty( $return['description'][$lang_code] ) )
			$stop[] = "#3 die - description, lang: ".$lang_code;
		
		if ( mb_strlen( $return['description'][$lang_code], 'utf-8') > 200 )
			$stop[] = "#4 die - description, max 200, lang: ".$lang_code;
	}
	if ( $stop ) {
		echo 'Error in ';
		print_r ( $stop );
	} else {
		echo "<h1>SUCCESS</h1>";
		print_r ( $return );
	}
}
?>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST">
title bg <input type="text" name="title[bg]" /><br />
title us <input type="text" name="title[us]" /><br />
title gr <input type="text" name="title[gr]" /><br /><br />

description bg <input type="text" name="description[bg]" /><br />
description us <input type="text" name="description[us]" /><br />
description gr <input type="text" name="description[gr]" /><br />
<input type="submit" name="submit" />
</form>

За момента го намирам за работещо т.е. функционира долу горе както си го представям, но това правилен начин на изпълнение ли е? Иска ми се да бъде максимално просто, оптимизирано, работещо и професионално. :think:

Идеята ми при филтрацията се чудя дали да не напиша отделен клас, в който се извършват проверките?
 
Ето какво направих на този етап, моля за мнение дали структурата и принципите са правилни.

Код:
<?php
$file = dirname(__FILE__) . '/Validator.php';
if (file_exists($file)) {
	require $file;
}
function get_intersect(...$arrays){
    $instersect_arrays = array();

    foreach($arrays as $array){
        if(!empty($array)){
            array_push($instersect_arrays,$array);
        }
    }

    return call_user_func_array('array_intersect', $instersect_arrays);
}
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}
$langs_all = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
	'gr' => [ 'id' => '3', 'code' => 'gr', ],
];
$langs_enabled = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
	'us' => [ 'id' => '2', 'code' => 'us', ],
];
$langs_default = [
	'bg' => [ 'id' => '1', 'code' => 'bg', ],
];
$langs_real = array();
$langs_real = get_intersect($langs_enabled, $langs_all);
$stop = [];
if(isset($_POST['submit'])) {
	$array = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);
	$return = array();
	foreach ( array_keys($array) as $fieldKey ) {
		foreach ( $array[$fieldKey] as $lang_code => $value ) {
			if( in_array_r( $lang_code, $langs_real) ) {
				$return[$fieldKey][$lang_code] = $value;
			}
		}
	}
	foreach ( $langs_default as $lang_code => $value ) {
		// Set data and validation rules
		$rules = array( 
			'title['.$lang_code.']' 	  => 'required:Title|min:8|max:200', 
			'description['.$lang_code.']' => 'norequired:Description|min:20'
		);
		$data = array( 
			'title['.$lang_code.']'		  => $return['title'][$lang_code], 
			'description['.$lang_code.']' => $return['description'][$lang_code],  
		);
		
	}
	// Run validation
	$validator = new Validator();
	if ($validator->validate($data, $rules) == true) {
		// Validation passed. Set user values.
		echo "<h1>SUCCESS</h1>";
		print_r ( $return );
	} else {
		// Validation failed. Dump validation errors.
		var_dump($validator->getErrors());
	}
}
?>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST">
<label for="title[bg]">title bg</label> <input type="text" name="title[bg]" id="title[bg]" /><br />
<label for="title[us]">title us</label> <input type="text" name="title[us]" id="title[us]" /><br />
<label for="title[gr]">title gr</label> <input type="text" name="title[gr]" id="title[gr]" /><br /><br />

<label for="description[bg]">description bg</label> <input type="text" name="description[bg]" id="description[bg]" /><br />
<label for="description[us]">description us</label> <input type="text" name="description[us]" id="description[us]" /><br />
<label for="description[gr]">description gr</label> <input type="text" name="description[gr]" id="description[gr]" /><br />
<input type="submit" name="submit" />
</form>


Validator.php
Код:
<?php
class Validator
{
    /**
     * Validation errors
     * @var array
     */
    private $errors = array();
    private $Msg = array();
    /**
     * Validate data against a set of rules and set errors in the $this->errors 
     * array
     * @param array $data
     * @param array $rules
     * @return boolean
     */
    public function validate (Array $data, Array $rules)
    {
        $valid = true;
        
        foreach ($rules as $item => $ruleset) {
            // required|email|min:8|msg:title
            $ruleset = explode('|', $ruleset);
            
            foreach ($ruleset as $rule) {
                
                $pos = strpos($rule, ':');
                if ($pos !== false) {
                    $parameter = substr($rule, $pos + 1);
                    $rule = substr($rule, 0, $pos);
                }
                else {
                    $parameter = '';
                }
                // validateEmail($item, $value, $param)
                $methodName = 'validate' . ucfirst($rule);
                $value = isset($data[$item]) ? $data[$item] : NULL;
                if (method_exists($this, $methodName)) {
                    $this->$methodName($item, $value, $parameter) OR $valid = false;
                }
            }
        }
        
        
        return $valid;
    }
    
    /**
     * Get validation errors
     * @return array:
     */
    public function getErrors ()
    {
        return $this->errors;
    }
    
    /**
     * Validate the $value of $item to see if it is present and not empty
     * @param string $item
     * @param string $value
     * @param string $parameter
     * @return boolean
     */
    private function validateRequired ($item, $value, $parameter)
    {
        if ($value === '' || $value === NULL || $parameter == false) {
			$this->Msg[$item] = $parameter;
			$Msg = isset($parameter) ? $parameter : $item;
            $this->errors[$item][] = 'The '.$Msg.' field is required';
            return false;
        }
        
        return true;
    }
    /**
     * Validate the $value of $item to see if it is present and not empty
     * @param string $item
     * @param string $value
     * @param string $parameter
     * @return boolean
     */
    private function validateNorequired ($item, $value, $parameter)
    {
        $this->Msg[$item] = $parameter;
        return true;
    }
    
    /**
     * Validate the $value of $item to see if it is a valid email address
     * @param string $item
     * @param string $value
     * @param string $parameter
     * @return boolean
     */
    private function validateEmail ($item, $value, $parameter)
    {
        if (! filter_var($value, FILTER_VALIDATE_EMAIL)) {
			$Msg[$item] = isset($this->Msg[$item]) ? $this->Msg[$item] : $item;
            $this->errors[$item][] = 'The ' . $Msg[$item] . ' field should be a valid email addres';
            return false;
        }
        
        return true;
    }
    
    /**
     * Validate the $value of $item to see if it is fo at least $param 
     * characters long
     * @param string $item
     * @param string $value
     * @param string $parameter
     * @return boolean
     */
    private function validateMin ($item, $value, $parameter)
    {
        if (strlen($value) >= $parameter == false) {
			$Msg[$item] = isset($this->Msg[$item]) ? $this->Msg[$item] : $item;
            $this->errors[$item][] = 'The ' . $Msg[$item] . ' field should have a minimum length of ' . $parameter;
            return false;
        }
        
        return true;
    }
    
    /**
     * Validate the $value of $item to see if it is fo at least $param 
     * characters long
     * @param string $item
     * @param string $value
     * @param string $parameter
     * @return boolean
     */
    private function validateMax ($item, $value, $parameter)
    {
        if (strlen($value) < $parameter == false) {
			$Msg[$item] = isset($this->Msg[$item]) ? $this->Msg[$item] : $item;
            $this->errors[$item][] = 'The ' . $Msg[$item] . ' field should have a maximum length of ' . $parameter;
            return false;
        }
        
        return true;
    }
}

output:
Код:
array(2) {
  ["title[bg]"]=>
  array(2) {
    [0]=>
    string(27) "The Title field is required"
    [1]=>
    string(49) "The Title field should have a minimum length of 8"
  }
  ["description[bg]"]=>
  array(1) {
    [0]=>
    string(56) "The Description field should have a minimum length of 20"
  }
}
<form action="/index.php" method="POST">
<label for="title[bg]">title bg</label> <input type="text" name="title[bg]" id="title[bg]" /><br />
<label for="title[us]">title us</label> <input type="text" name="title[us]" id="title[us]" /><br />
<label for="title[gr]">title gr</label> <input type="text" name="title[gr]" id="title[gr]" /><br /><br />

<label for="description[bg]">description bg</label> <input type="text" name="description[bg]" id="description[bg]" /><br />
<label for="description[us]">description us</label> <input type="text" name="description[us]" id="description[us]" /><br />
<label for="description[gr]">description gr</label> <input type="text" name="description[gr]" id="description[gr]" /><br />
<input type="submit" name="submit" />
</form>
 
Доста объркана логика използваш.
Според мен, ще е по-правилно да си направиш таблица в БД със езици.. примерно 'languages' и вътре да имаш:
ID TagLocaleWord
1post_titlebgЗаглавие на публикация
2post_titleenPost title


1. Имаш си някаква дефинирана/глобална/ променлива, която ти държи езика, който ще ти е по подразбиране, примерно - en.
$default_language = 'en';
Може да се взима и от таблица, ако имаш site_settings примерно и се управлява от админ панел.. всичко зависи от архитектурата на сайта.
2. Имаш си дефинирана променлива, която ти държи масив със забранените езици..
$disabled_languages = array('de', 'fr');
Може също да се взима и от таблица ако пак имаш админ панел и т.н. ..
/Общо взето държиш логика на config/

3.Правиш си заявка към базата да ти вади само тези резултати от таблицата, където 'locale' клетката отговаря на разрешен език, забранените не ги вадиш.
Правиш си един метод примерно :
Код:
public function lang($word_tag){
     //тук разписваш заявка за думата която искаш да вземеш на текущо зададения активен език
     вземи ми дума ($word_tag) от таблицата ('languages') WHERE locale == 'текущ избран език' ....
     резултат
     if(резултат){
           return резултат;
     }if else{   //Или ми дай същата дума ама на default езика
           заявка вземи ми дума ($word_tag) от таблицата ('languages') WHERE locale == $default_language (точка 1) ....
            рeзултат
            return резултат
     }else{  //ако и двете не върнат резултат, връщаш null
            return null;
     }


И в сайта го ползваш така:
$lang('post_title') .. като ако текущия избран език е Български, по схемата от таблицата трябва да ти върне 'Заглавие на публикация' .. ако не успее по някаква причина да го намери, ще ти го върне на default езика, тоест 'en' .. 'Post title'. Ако по някаква причина и там не успее .. просто не ти връща дума и няма да гърми грешка.

Не влизам във подробности нарочно със код и т.н... сам да разбереш концепцията и логиката и да се опиташ да го имплементираш по свой си начин :) Предполагам е разбираемо, ако модератор прецени може да ми изтрие поста.

Успех и поздрави,
Г. Иванов !
 
Аз невиждам смисъл да се вдига тема от 2020г.
Тук се обсъждаше не дали езиците са в db или файл, а се объждаше как е по-правилно да се направят входящите данни, да се обработят правилно т.е. чрез масив и след това вече - кой, както желае да ги запаметява => дб/файл

Относно съвета ти за база данни, аз ползвам този пример на добра практика:


Аз ползвам третия вариант.

Advantages

  • Proper normalization — seems like a clean, relational approach
  • Ease in adding a new language — doesn’t require schema changes
  • Columns keep their names — doesn’t require “_lang” suffixes or something else
  • Easy to query — relatively simple querying (only one JOIN is required)
Disadvantages

  • May double the number of tables — You have to create translation tables for all your tables that have columns that need to be translated
 
Последно редактирано:
Извинявам се, изобщо не съм видял датата на поста.. случайно попаднах на тази тема и реших да се включа.

Одобрявам вариантите ти! :) Като цяло няма грешен подход, работата с многоезичност е доста свободна откъм избор как да бъде имплементирано стига да не чупи кода и да няма бъгове.

Успех и поздрави,
Г. Иванов !
 

Горе