简化相同的php条件
我有一个问题,我想知道根据一种语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我有sthg simple:简化相同的php条件,php,templates,if-statement,printf,Php,Templates,If Statement,Printf,我有一个问题,我想知道根据一种语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我有sthg simple: function getStringA($lang,$data1,$data2){ if($lang=='en'){return 'my string is '.$data1.' and '.$data2;} elseif($lang=='fr'){return 'ma chaine est '.$data1.' et '.$data2;} elseif($lan
function getStringA($lang,$data1,$data2){
if($lang=='en'){return 'my string is '.$data1.' and '.$data2;}
elseif($lang=='fr'){return 'ma chaine est '.$data1.' et '.$data2;}
elseif($lang=='it'){return $data1.'blabla '.$data2.' blabla';}
..
[50 conditions]
}
function getStringB($lang,$data){
[same 50 conditions, one per language]
}
function getStringC($lang,$data){
..
}
...
然后:
echo getStringA('en','test','test1');
echo getStringB('en','AAAA');
echo getStringB('en','BBBB');
..
$conditions = ['en' => 'foo', 'fr' => 'bar', etc...]
if (isset($conditions[$lang])) {
return $conditions[$lang];
} else {
return $default_value;
}
将字符串放入数组中,并将串联更改为
printf()-like
函数格式:
$stringsA = array(
'en' => 'my string is %s and %s',
'fr' => 'ma chaine est %s et %s',
// ...
);
然后在函数中按数组键获取文本:
function getStringA($lang,$data1,$data2){
return isset($stringsA[$lang])? vprintf($stringsA[$lang], array($data1, $data2)) : '';
}
您还可以在字符串中使用自己的占位符和str\u replace()
函数:
// e.g. 'my string is {propery} and {secondProperty}'
function getStringA($lang,$data1,$data2){
return isset($stringsA[$lang])? str_replace(array('{propery}', '{secondProperty}'), array($data1, $data2), $stringsA[$lang]) : '';
}
使用数组和传递参数可以使用函数
这是非常基本的想法。它可以写得更好。翻译可以保存在ini、xml、yaml等配置文件中,也可以用OOP编写,这样使用起来会更好。如何传递参数?可能是另一个构建字符串的函数。但这就是你如何摆脱50项if/else/else/else/else/…../else链的方法。这不仅仅是返回翻译后的字符串,而是如何使用语言模板构建带有参数的字符串(参数在字符串中的位置可能会改变,取决于语言)。谢谢,但非常沉重,我终于找到了一个窍门,请阅读我的回答,不要太重,但要灵活。也许将数组作为第一个参数传递并不好,但我不想使用全局数组或静态数组。
$translate = [
'en' => [
'my_string_is' => 'my string is %s and %s';
],
'fr' => [
'my_string_is' => 'ma chaine est %s et %s';
]
];
function translate ($translations, $word, $lang, array $params = []) {
return isset($translations[$lang][$word]) ? vsprintf($translations[$lang][$word], $params) : $word;
}
// usage
echo translate($translations, 'my_string_is' ,'en', ['wordA', 'wordB']);
echo translate($translations, 'my_string_is' ,'fr', ['wordA', 'wordB']);