我有一个问题,我想知道根据语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我很简单:
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');
..
我想使用printf,但我不知道它是否会更好,我需要快速,最重要,易于维护。
有什么想法吗?
答案 0 :(得分:2)
将字符串放入数组并将连接更改为printf()-alike
函数格式:
$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_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]) : '';
}
答案 1 :(得分:0)
为什么不是阵列?
$conditions = ['en' => 'foo', 'fr' => 'bar', etc...]
if (isset($conditions[$lang])) {
return $conditions[$lang];
} else {
return $default_value;
}
答案 2 :(得分:-1)
使用数组并传递params,您可以使用vsprintf()函数
$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']);
这是非常基本的想法。它可以写得更好。翻译可以保存在配置文件中,如ini,xml,yaml等,也可以用OOP编写,因此最好使用。